﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using ComunesMGI.DataTypes;
using ComunesMGI.Enum;
using ComunesMGI.Constantes;

using Microsoft.SharePoint;
using Microsoft.SharePoint.Utilities;
using System.IO;

namespace MGI.AccesoDatos.AccesoSP
{
    class SPAcceso
    {
        static public void ConectarLista(string urlSistema, string lista, ref SPSite mySite, ref SPWeb myWeb, ref SPList spLista)
        {
            SPEventLog.WriteLog("Conectado: " + urlSistema);
            try
            {
                mySite = new SPSite(urlSistema);
            }
            catch (Exception e)
            {
                SPEventLog.WriteLog("No se pudo conectar al sitio Sharepoint: " + e.Message);
                throw new ComunesMGI.Excepciones.SPConeccionFallida("No se pudo conectar al sitio Sharepoint: " + e.Message);
            }
            SPEventLog.WriteLog("Intentando abrir web para acceder a las listas");
            try
            {
                myWeb = mySite.OpenWeb();
            }
            catch (Exception e)
            {
                SPEventLog.WriteLog("No se pudo hacer la apertura:" + e.Message );
                throw new ComunesMGI.Excepciones.SPConeccionFallida("No se pudo abrir el web:" + e.Message );
            }

            if (myWeb != null)
            {
                if (myWeb.Permissions != null)
                {
                    SPEventLog.WriteLog("Se logró apertura correctamente");
                    SPEventLog.WriteLog("Usuario con el que se conectó: " + myWeb.CurrentUser.LoginName);
                    SPEventLog.WriteLog("Permisos de Acceso: ");
                    foreach (SPPermission permiso in myWeb.Permissions)
                    {
                        SPEventLog.WriteLog("   " + permiso.ToString());
                    }

                }
                else
                {
                    SPEventLog.WriteLog("No hay permisos");
                }
            }
            else
            {
                SPEventLog.WriteLog("No se pudo hacer la apertura");
                throw new ComunesMGI.Excepciones.SPConeccionFallida("No se pudo abrir el web");
            }

            SPEventLog.WriteLog("Intentando obtener la lista de Sharepoint: "+lista);
            try
            {
                spLista = myWeb.Lists[lista];
            }
            catch (Exception e)
            {
                SPEventLog.WriteLog("Lista " + lista + " no encontrada");
                throw new ComunesMGI.Excepciones.SPObjetoInexistente("Lista " + lista + " no encontrada");
            }



            if (spLista == null)
            {
                SPEventLog.WriteLog("Lista " + lista + " no encontrada");
                throw new ComunesMGI.Excepciones.SPObjetoInexistente("Lista " + lista + " no encontrada");
            }
            else 
            {
                SPEventLog.WriteLog("Se obtuvo correctamente la lista: " + spLista.Title + " " + spLista.ID);                
            }
        }

        static public void Conectar(string urlSistema, ref SPSite mySite, ref SPWeb myWeb)
        {
            SPEventLog.WriteLog("Intentando conectar con sitio Sharepoint: " + urlSistema);
            try
            {
                mySite = new SPSite(urlSistema);
            }
            catch (Exception e)
            {
                SPEventLog.WriteLog("No se pudo conectar al sitio Sharepoint: " + e.Message);
                throw new ComunesMGI.Excepciones.SPConeccionFallida("No se pudo conectar al sitio Sharepoint: " + e.Message );            
            }

            SPEventLog.WriteLog("Conectado: " + urlSistema);
            SPEventLog.WriteLog("Intentando abrir web para acceder a las listas");
            myWeb = mySite.OpenWeb();
            if (myWeb != null)
            {
                if (myWeb.Permissions != null)
                {
                    SPEventLog.WriteLog("Se logró apertura correctamente");
                    SPEventLog.WriteLog("Usuario con el que se conectó: " + myWeb.CurrentUser.LoginName);
                    SPEventLog.WriteLog("Permisos de Acceso: ");
                    foreach (SPPermission permiso in myWeb.Permissions)
                    {
                        SPEventLog.WriteLog("   " + permiso.ToString());
                    }

                }
            }
            else 
            {
                SPEventLog.WriteLog("No se pudo hacer la apertura");
                throw new ComunesMGI.Excepciones.SPConeccionFallida("No se pudo abrir el web");
            }
        }

        static public void Desconectar(ref SPSite mySite, ref SPWeb myWeb) 
        { 
            myWeb.Close();
            mySite.Close();
        }


        /// <summary>
        /// Dada una lista de sharepoint y una lista de datacampo 
        /// conteniendo nombre de los campos, tipo y un valor para los 
        /// mismos, se realiza el alta en sharepoint con la información. 
        /// Se usa tambien el sitio sharepoint para obtener información sobre
        /// la conversión de fechas del formato "dd-mm-aaaa hh:mm" a
        /// cualquier formato configurado en el sharepoint.
        /// También se pueden adjuntar archivos.
        /// 
        /// Retorna ID y otra información de lo creado.
        /// </summary>
        /// <param name="myWeb"></param>
        /// <param name="spLista"></param>
        /// <param name="campos"></param>
        /// <param name="archivos"></param>
        /// <returns>DataAltaIncidente</returns>
        static public DataAltaIncidente Impactar(SPWeb myWeb, SPList spLista, List<DataCampo> campos)
        {
            SPListItem newItem = spLista.Items.Add();
            foreach (DataCampo dataCampo in campos)
            {
                switch (dataCampo.Tipo)
                {
                    case CampoSharepoint.DateTime:
                        string[] fechaHora = dataCampo.Valor.Split(' ');
                        newItem[dataCampo.Titulo] = SPUtility.ParseDate(myWeb, fechaHora[0], fechaHora[1], false);
                        break;
                    case CampoSharepoint.User:
                        SPUser spUser = myWeb.AllUsers[dataCampo.Valor];
                        newItem[dataCampo.Titulo] = spUser;
                        break;
                    default:
                        newItem[dataCampo.Titulo] = dataCampo.Valor;
                        break;
                }
            }
            newItem.Update();

            //obtiene la parte final de la url conteniendo el nombre de la lista
            int ini = spLista.DefaultViewUrl.LastIndexOf(ConstantesMGI.PageDefaultUrlLista + "/");
            //elimina la vista por defecto porque no permite acceso directo a la url del item
            //en su lugar usamos DispForm.aspx
            int largo = spLista.DefaultViewUrl.LastIndexOf("/") - ini;
            string parteLista = spLista.DefaultViewUrl.Substring(ini, largo) + "/" + ConstantesMGI.PageDefaultUrlListaItems;

            string url = spLista.ParentWeb.Url + "/" + parteLista + "?ID=" + newItem["ID"].ToString();
            return new DataAltaIncidente(newItem.ID, url);
        }


                /// <summary>
        /// Dada una lista de sharepoint y una lista de datacampo 
        /// conteniendo nombre de los campos, tipo y un valor para los 
        /// mismos, se realiza el alta en sharepoint con la información. 
        /// Se usa tambien el sitio sharepoint para obtener información sobre
        /// la conversión de fechas del formato "dd-mm-aaaa hh:mm" a
        /// cualquier formato configurado en el sharepoint.
        /// También se pueden adjuntar archivos.
        /// 
        /// Retorna ID y otra información de lo creado.
        /// </summary>
        /// <param name="myWeb"></param>
        /// <param name="spLista"></param>
        /// <param name="campos"></param>
        /// <param name="archivos"></param>
        /// <returns>DataAltaIncidente</returns>
        static public string[] Impactar2(SPWeb myWeb, SPList spLista, List<DataCampo> campos)
        {
            SPListItem newItem = spLista.Items.Add();
            foreach (DataCampo dataCampo in campos)
            {
                switch (dataCampo.Tipo)
                {
                    case CampoSharepoint.DateTime:
                        string[] fechaHora = dataCampo.Valor.Split(' ');
                        newItem[dataCampo.Titulo] = SPUtility.ParseDate(myWeb, fechaHora[0], fechaHora[1], false);
                        break;
                    case CampoSharepoint.User:
                        SPUser spUser = myWeb.AllUsers[dataCampo.Valor];
                        newItem[dataCampo.Titulo] = spUser;
                        break;
                    default:
                        newItem[dataCampo.Titulo] = dataCampo.Valor;
                        break;
                }
            }
            newItem.Update();

            //obtiene la parte final de la url conteniendo el nombre de la lista
            int ini = spLista.DefaultViewUrl.LastIndexOf(ConstantesMGI.PageDefaultUrlLista + "/");
            //elimina la vista por defecto porque no permite acceso directo a la url del item
            //en su lugar usamos DispForm.aspx
            int largo = spLista.DefaultViewUrl.LastIndexOf("/") - ini;
            string parteLista = spLista.DefaultViewUrl.Substring(ini, largo) + "/" + ConstantesMGI.PageDefaultUrlListaItems;

            string url = spLista.ParentWeb.Url + "/" + parteLista + "?ID=" + newItem["ID"].ToString();
            string []result = new string [2];
            result [0] =newItem.ID.ToString();
            result [1] = url;
            return result;
        }






        /// <summary>
        /// Retorna los elementos de la lista que tienen los valores indicados en
        /// la lista de datacampos
        /// </summary>
        List <string[]> getItemCondicion(string urlSistema, List<DataCampo> condicion, List<DataCampo> obtener)
        {
            /*
            SPSite mySite = new SPSite(sitioSistema);
            SPWeb myWeb = mySite.OpenWeb();
            SPList spLista = myWeb.Lists[ConstantesMGI.NomListaTareas];
            SPListItem spItem = spLista.Items.GetItemById( idTarea);

            string mail = null;
            if (SPUtility.IsLoginValid(mySite, usuario.Nombre))
            {
                SPUser spUser = myWeb.AllUsers[usuario.Nombre];
                spItem["Asignado a"] = spUser;
                spItem["IDOriginal"] = idIncidente;
                spItem.Update();
                mail = spUser.Email;
            }*/
            return null;
        }
    

    }















}
